{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Importing the libraries\n",
    "import glob\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from tqdm import tqdm # Progress bar for long loops\n",
    "from nltk import ngrams\n",
    "from nltk.corpus import stopwords\n",
    "from nltk.stem import WordNetLemmatizer\n",
    "from nltk.tokenize import word_tokenize\n",
    "from sklearn import metrics\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.feature_selection import chi2, SelectKBest\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "lemmatizer = WordNetLemmatizer()\n",
    "english_stopwords = set(stopwords.words('english'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. Data reading and preprocessing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "label\n",
       "sport            511\n",
       "business         510\n",
       "politics         417\n",
       "tech             401\n",
       "entertainment    386\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Find all the files in the bbc folder\n",
    "all_data = glob.glob(\"./datasets_coursework1/bbc/*/*.txt\")\n",
    "\n",
    "# Make pandas dataframe\n",
    "dataset = []\n",
    "for document in all_data:\n",
    "    with open(document, 'r') as fp:\n",
    "        text = fp.read()\n",
    "    label = document.split('/')[3]\n",
    "    dataset.append(dict(text=text, label=label))\n",
    "df = pd.DataFrame(dataset)\n",
    "df.label.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 2225/2225 [00:05<00:00, 416.05it/s]\n"
     ]
    }
   ],
   "source": [
    "# Define the text preprocessing function\n",
    "def preprocess_text(text):\n",
    "    # Text tokenization using nltk\n",
    "    tokens = word_tokenize(text)\n",
    "    # Lowercasing\n",
    "    tokens = [word.lower() for word in tokens]\n",
    "    # Remove non-alphabetic characters\n",
    "    tokens = [word for word in tokens if word.isalpha()]\n",
    "    # Remove words with length <= 2\n",
    "    tokens = [word for word in tokens if len(word) > 2]\n",
    "    # Remove stopwords\n",
    "    tokens = [word for word in tokens if word not in english_stopwords]\n",
    "    # Lemmatization\n",
    "    tokens = [lemmatizer.lemmatize(word) for word in tokens]\n",
    "    # Join the tokens back into a single string\n",
    "    text = ' '.join(tokens)\n",
    "    return text\n",
    "    \n",
    "# Apply the text preprocessing function to the text column\n",
    "df['text'] = [preprocess_text(text) for text in tqdm(df['text'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set size: 1780\n",
      "Testing set size: 445\n"
     ]
    }
   ],
   "source": [
    "# Apply sklearn's train_test_split function to split the dataset into training and testing sets\n",
    "df_train, df_test = train_test_split(df, test_size=0.2, random_state=42, stratify=df['label'])\n",
    "print(\"Training set size:\", df_train.shape[0])\n",
    "print(\"Testing set size:\", df_test.shape[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Text vectorization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define the function to extract n-grams from the text\n",
    "NGRAM = (1, 2) # Unigrams and bigrams"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['this', 'is', 'a', 'test', 'document', 'this is', 'is a', 'a test', 'test document']\n"
     ]
    }
   ],
   "source": [
    "# An utility function to get list of n-gram tokens from a text document\n",
    "def get_ngram_tokens(tokens, ngram=NGRAM):\n",
    "    ngram_tokens = []\n",
    "    for i in range(ngram[0], ngram[1]+1):\n",
    "        ngram_tokens += list(ngrams(tokens, i))\n",
    "    ngram_tokens = [' '.join(token) for token in ngram_tokens]\n",
    "    return ngram_tokens\n",
    "\n",
    "# Test\n",
    "print(get_ngram_tokens(['this', 'is', 'a', 'test', 'document'], ngram=(1, 2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vocabulary size: 13497\n"
     ]
    }
   ],
   "source": [
    "# Term frequencies\n",
    "def build_vocabulary(documents, ngram=NGRAM):\n",
    "    vocabulary = {}\n",
    "    for document in documents:\n",
    "        ngram_tokens = get_ngram_tokens(document.split(), ngram)\n",
    "        for token in ngram_tokens:\n",
    "            if token not in vocabulary:\n",
    "                vocabulary[token] = 1\n",
    "            else:\n",
    "                vocabulary[token] += 1\n",
    "    return vocabulary\n",
    "\n",
    "vocab = build_vocabulary(df_train['text'])\n",
    "# Remove terms that appear in less than 5 documents\n",
    "vocab = {k: v for k, v in vocab.items() if v >= 5}\n",
    "# Remove terms that appear in more than 50% of the documents\n",
    "vocab = {k: v for k, v in vocab.items() if v / df_train.shape[0] <= 0.5}\n",
    "\n",
    "# Print final vocabulary size\n",
    "print(\"Vocabulary size:\", len(vocab))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Vectorizing training set: 100%|██████████| 1780/1780 [00:41<00:00, 42.66it/s]\n",
      "Vectorizing testing set: 100%|██████████| 445/445 [00:09<00:00, 45.97it/s]\n"
     ]
    }
   ],
   "source": [
    "# Vectorize the text using the vocabulary\n",
    "def build_text_vector(vocab, documents, ngram=NGRAM):\n",
    "    vec = np.zeros((len(documents), len(vocab)))\n",
    "    for i, document in enumerate(documents):\n",
    "        ngram_tokens = get_ngram_tokens(document.split(), ngram)\n",
    "        for token in ngram_tokens:\n",
    "            if token in vocab:\n",
    "                vec[i, list(vocab.keys()).index(token)] = 1\n",
    "    return vec\n",
    "\n",
    "train_tf = build_text_vector(vocab, tqdm(df_train['text'], desc=\"Vectorizing training set\"))\n",
    "test_tf = build_text_vector(vocab, tqdm(df_test['text'], desc=\"Vectorizing testing set\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set shape: (1780, 13497)\n",
      "Testing set shape: (445, 13497)\n"
     ]
    }
   ],
   "source": [
    "print(\"Training set shape:\", train_tf.shape)\n",
    "print(\"Testing set shape:\", test_tf.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Select other features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1 Text Lengths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x200 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Boxplot the text lengths over labels\n",
    "text_lengths = df_train['text'].apply(lambda x: len(x.split()))\n",
    "text_lengths_df = pd.DataFrame(dict(text_length=text_lengths, label=df_train['label']))\n",
    "plt.figure(figsize=(5, 2))\n",
    "plt.title(\"Text length distribution over labels\")\n",
    "plt.xlabel(\"Label\")\n",
    "plt.ylabel(\"Text length\")\n",
    "plt.boxplot([text_lengths_df[text_lengths_df['label'] == label]['text_length'] for label in text_lengths_df['label'].unique()], labels=text_lengths_df['label'].unique())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 Average token lengths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x200 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Boxplot the average token length over labels\n",
    "avg_token_lengths = df_train['text'].apply(lambda x: np.mean([len(token) for token in x.split()]))\n",
    "avg_token_lengths_df = pd.DataFrame(dict(avg_token_length=avg_token_lengths, label=df_train['label']))\n",
    "plt.figure(figsize=(5, 2))\n",
    "plt.title(\"Average token length distribution over labels\")\n",
    "plt.xlabel(\"Label\")\n",
    "plt.ylabel(\"Average token length\")\n",
    "plt.boxplot([avg_token_lengths_df[avg_token_lengths_df['label'] == label]['avg_token_length'] for label in avg_token_lengths_df['label'].unique()], labels=avg_token_lengths_df['label'].unique())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Hyperparameter Tuning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set shape: (1780, 13499)\n",
      "Testing set shape: (445, 13499)\n"
     ]
    }
   ],
   "source": [
    "# Concatenate into feature vector\n",
    "train_features = np.concatenate([train_tf, \n",
    "                                 text_lengths_df['text_length'].values.reshape(-1, 1), \n",
    "                                 avg_token_lengths_df['avg_token_length'].values.reshape(-1, 1)], axis=1)\n",
    "test_features = np.concatenate([test_tf, \n",
    "                                df_test['text'].apply(lambda x: len(x.split())).values.reshape(-1, 1), \n",
    "                                df_test['text'].apply(lambda x: np.mean([len(token) for token in x.split()])).values.reshape(-1, 1)], axis=1)\n",
    "print(\"Training set shape:\", train_features.shape)\n",
    "print(\"Testing set shape:\", test_features.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 40 candidates, totalling 200 fits\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=10; total time=   1.3s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=10; total time=   1.6s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=10; total time=   1.6s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=10; total time=   1.7s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=10; total time=   1.7s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=50; total time=   4.9s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=50; total time=   5.1s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=50; total time=   5.1s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=50; total time=   5.2s\n",
      "[CV] END ................min_samples_leaf=1, n_estimators=50; total time=   5.3s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=100; total time=   9.6s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=100; total time=   9.7s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=100; total time=  10.0s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=100; total time=  10.3s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=100; total time=  10.7s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=200; total time=  18.8s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=200; total time=  18.4s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=200; total time=  18.0s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=200; total time=  18.4s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=200; total time=  19.2s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=300; total time=  26.8s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=300; total time=  26.3s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=300; total time=  27.3s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=300; total time=  27.3s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=300; total time=  29.1s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=10; total time=   0.9s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=10; total time=   1.1s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=10; total time=   1.5s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=10; total time=   1.2s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=10; total time=   1.1s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=400; total time=  37.4s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=50; total time=   4.7s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=400; total time=  36.1s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=400; total time=  36.3s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=400; total time=  36.0s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=50; total time=   4.2s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=400; total time=  36.6s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=50; total time=   4.8s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=50; total time=   4.6s\n",
      "[CV] END ................min_samples_leaf=2, n_estimators=50; total time=   4.5s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=100; total time=   8.5s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=500; total time=  44.2s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=100; total time=   8.5s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=100; total time=   9.4s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=100; total time=   8.8s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=100; total time=   9.1s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=500; total time=  46.4s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=500; total time=  45.9s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=500; total time=  45.8s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=500; total time=  47.1s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=200; total time=  16.9s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=200; total time=  17.8s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=200; total time=  16.5s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=200; total time=  18.0s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=200; total time=  18.9s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=600; total time=  53.6s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=600; total time=  53.6s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=300; total time=  25.5s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=600; total time=  53.3s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=300; total time=  27.3s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=600; total time=  56.0s\n",
      "[CV] END ...............min_samples_leaf=1, n_estimators=600; total time=  55.4s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=300; total time=  25.6s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=300; total time=  26.1s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=300; total time=  28.4s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=10; total time=   1.1s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=10; total time=   1.1s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=10; total time=   1.1s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=10; total time=   1.3s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=400; total time=  31.6s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=10; total time=   1.1s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=400; total time=  34.3s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=50; total time=   3.8s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=50; total time=   3.9s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=50; total time=   4.3s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=50; total time=   4.1s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=400; total time=  34.2s\n",
      "[CV] END ................min_samples_leaf=4, n_estimators=50; total time=   3.7s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=400; total time=  35.7s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=400; total time=  36.9s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=100; total time=   7.3s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=100; total time=   7.8s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=100; total time=   7.9s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=100; total time=   8.2s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=100; total time=   7.9s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=500; total time=  42.7s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=500; total time=  45.5s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=200; total time=  14.8s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=500; total time=  43.2s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=200; total time=  14.5s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=500; total time=  41.8s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=500; total time=  44.2s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=200; total time=  14.5s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=200; total time=  15.3s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=200; total time=  15.9s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=600; total time=  50.4s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=600; total time=  50.7s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=300; total time=  22.7s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=600; total time=  52.0s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=300; total time=  23.0s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=300; total time=  22.9s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=600; total time=  52.0s\n",
      "[CV] END ...............min_samples_leaf=2, n_estimators=600; total time=  51.5s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=300; total time=  22.6s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=300; total time=  23.3s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=10; total time=   1.0s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=10; total time=   1.0s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=10; total time=   1.0s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=10; total time=   1.0s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=10; total time=   1.0s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=400; total time=  28.4s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=50; total time=   3.4s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=400; total time=  30.4s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=50; total time=   3.3s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=400; total time=  30.2s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=400; total time=  31.9s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=50; total time=   4.1s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=50; total time=   3.8s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=400; total time=  31.2s\n",
      "[CV] END ................min_samples_leaf=8, n_estimators=50; total time=   3.4s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=100; total time=   6.9s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=100; total time=   6.5s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=100; total time=   7.0s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=100; total time=   6.9s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=100; total time=   7.2s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=500; total time=  38.4s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=500; total time=  37.4s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=200; total time=  13.0s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=500; total time=  39.3s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=500; total time=  37.9s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=500; total time=  39.9s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=200; total time=  12.9s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=200; total time=  12.9s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=200; total time=  12.1s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=200; total time=  12.8s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=600; total time=  46.8s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=600; total time=  46.6s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=300; total time=  19.8s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=300; total time=  20.9s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=600; total time=  46.4s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=600; total time=  47.1s\n",
      "[CV] END ...............min_samples_leaf=4, n_estimators=600; total time=  45.6s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=300; total time=  19.8s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=300; total time=  20.2s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=300; total time=  20.7s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=10; total time=   0.9s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=10; total time=   0.8s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=10; total time=   0.9s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=10; total time=   0.8s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=10; total time=   0.8s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=400; total time=  25.5s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=400; total time=  26.1s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=50; total time=   3.1s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=400; total time=  26.4s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=50; total time=   3.1s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=400; total time=  26.6s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=50; total time=   2.9s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=400; total time=  27.5s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=50; total time=   2.7s\n",
      "[CV] END ...............min_samples_leaf=16, n_estimators=50; total time=   3.1s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=100; total time=   5.6s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=100; total time=   5.7s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=100; total time=   5.5s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=100; total time=   5.7s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=500; total time=  32.6s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=100; total time=   6.0s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=200; total time=  10.1s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=500; total time=  32.8s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=500; total time=  33.2s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=200; total time=  10.9s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=500; total time=  34.0s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=200; total time=  11.4s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=500; total time=  33.8s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=200; total time=  10.2s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=200; total time=  10.6s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=600; total time=  39.1s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=300; total time=  15.6s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=300; total time=  15.2s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=600; total time=  40.4s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=600; total time=  40.7s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=600; total time=  39.7s\n",
      "[CV] END ...............min_samples_leaf=8, n_estimators=600; total time=  38.4s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=300; total time=  14.9s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=300; total time=  17.2s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=300; total time=  16.1s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=400; total time=  19.8s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=400; total time=  20.9s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=400; total time=  20.6s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=400; total time=  21.4s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=400; total time=  21.2s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=500; total time=  24.4s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=500; total time=  20.3s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=500; total time=  20.2s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=500; total time=  21.8s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=500; total time=  21.2s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=600; total time=  19.4s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=600; total time=  20.8s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=600; total time=  18.4s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=600; total time=  20.6s\n",
      "[CV] END ..............min_samples_leaf=16, n_estimators=600; total time=  20.3s\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-5 {color: black;background-color: white;}#sk-container-id-5 pre{padding: 0;}#sk-container-id-5 div.sk-toggleable {background-color: white;}#sk-container-id-5 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-5 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-5 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-5 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-5 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-5 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-5 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-5 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-5 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-5 div.sk-item {position: relative;z-index: 1;}#sk-container-id-5 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-5 div.sk-item::before, #sk-container-id-5 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-5 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-5 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-5 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-5 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-5 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-5 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-5 div.sk-label-container {text-align: center;}#sk-container-id-5 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-5 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(random_state=42), n_jobs=-1,\n",
       "             param_grid={&#x27;min_samples_leaf&#x27;: [1, 2, 4, 8, 16],\n",
       "                         &#x27;n_estimators&#x27;: [10, 50, 100, 200, 300, 400, 500,\n",
       "                                          600]},\n",
       "             verbose=2)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-13\" type=\"checkbox\" ><label for=\"sk-estimator-id-13\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">GridSearchCV</label><div class=\"sk-toggleable__content\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(random_state=42), n_jobs=-1,\n",
       "             param_grid={&#x27;min_samples_leaf&#x27;: [1, 2, 4, 8, 16],\n",
       "                         &#x27;n_estimators&#x27;: [10, 50, 100, 200, 300, 400, 500,\n",
       "                                          600]},\n",
       "             verbose=2)</pre></div></div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-14\" type=\"checkbox\" ><label for=\"sk-estimator-id-14\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">estimator: RandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>RandomForestClassifier(random_state=42)</pre></div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-15\" type=\"checkbox\" ><label for=\"sk-estimator-id-15\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>RandomForestClassifier(random_state=42)</pre></div></div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "GridSearchCV(cv=5, estimator=RandomForestClassifier(random_state=42), n_jobs=-1,\n",
       "             param_grid={'min_samples_leaf': [1, 2, 4, 8, 16],\n",
       "                         'n_estimators': [10, 50, 100, 200, 300, 400, 500,\n",
       "                                          600]},\n",
       "             verbose=2)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params_grid = {\n",
    "    'n_estimators': [10, 50, 100, 200, 300, 400, 500, 600],\n",
    "    'min_samples_leaf': [1, 2, 4, 8, 16]\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(RandomForestClassifier(random_state=42, max_depth=None),\n",
    "                           params_grid, cv=5, n_jobs=-1, verbose=2)\n",
    "grid_search.fit(train_features, df_train['label'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best parameters: {'min_samples_leaf': 1, 'n_estimators': 300}\n",
      "Best cross-validation score: 0.9623595505617978\n"
     ]
    }
   ],
   "source": [
    "print(\"Best parameters:\", grid_search.best_params_)\n",
    "print(\"Best cross-validation score:\", grid_search.best_score_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training accuracy: 1.0\n",
      "Testing accuracy: 0.9685393258426966\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "     business       0.95      0.98      0.97       102\n",
      "entertainment       1.00      0.96      0.98        77\n",
      "     politics       0.96      0.92      0.94        84\n",
      "        sport       0.98      1.00      0.99       102\n",
      "         tech       0.95      0.97      0.96        80\n",
      "\n",
      "     accuracy                           0.97       445\n",
      "    macro avg       0.97      0.97      0.97       445\n",
      " weighted avg       0.97      0.97      0.97       445\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Train the model\n",
    "clf = grid_search.best_estimator_\n",
    "print(\"Training accuracy:\", clf.score(train_features, df_train['label']))\n",
    "pred = clf.predict(test_features)\n",
    "print(\"Testing accuracy:\", clf.score(test_features, df_test['label']))\n",
    "print(metrics.classification_report(df_test['label'], pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "|               |   precision |   recall |   f1-score |    support |\n",
      "|:--------------|------------:|---------:|-----------:|-----------:|\n",
      "| business      |    0.952381 | 0.980392 |   0.966184 | 102        |\n",
      "| entertainment |    1        | 0.961039 |   0.980132 |  77        |\n",
      "| politics      |    0.9625   | 0.916667 |   0.939024 |  84        |\n",
      "| sport         |    0.980769 | 1        |   0.990291 | 102        |\n",
      "| tech          |    0.95122  | 0.975    |   0.962963 |  80        |\n",
      "| accuracy      |    0.968539 | 0.968539 |   0.968539 |   0.968539 |\n",
      "| macro avg     |    0.969374 | 0.96662  |   0.967719 | 445        |\n",
      "| weighted avg  |    0.968829 | 0.968539 |   0.968417 | 445        |\n"
     ]
    }
   ],
   "source": [
    "report = metrics.classification_report(df_test['label'], pred, output_dict=True)\n",
    "# to markdown\n",
    "report_df = pd.DataFrame(report).transpose()\n",
    "print(report_df.to_markdown())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Feature importance\n",
    "feature_importance = clf.feature_importances_\n",
    "sorted_idx = np.argsort(feature_importance)[::-1][:20]\n",
    "pos = np.arange(sorted_idx.shape[0]) + .5\n",
    "plt.figure()\n",
    "plt.barh(pos, feature_importance[sorted_idx], align='center')\n",
    "plt.yticks(pos, np.array(list(vocab.keys()) + ['text_length', 'avg_token_length'])[sorted_idx])\n",
    "plt.xlabel('Feature Importance')\n",
    "plt.title('Feature Importance')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
